/*
 * Copyright (c) 2013 UCE (Universidad Central del Ecuador), todos los derechos
 * reservados. Este software es confidencial y su informacion es propiedad de
 * UCE (Universidad Central del Ecuador). No debe revelar tal informacion y debe usarla
 * unicamente de acorde con los terminos de uso.
 */

package ec.linde.modulos.proyectos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

import ec.linde.enumeraciones.Estado;
import ec.linde.enumeraciones.TipoNegocio;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/03/2013
 * @author: Alex Carrillo
 * @FechaModificacion: 29/03/2013
 * @author: Alex Carrillo
 * @version: 1.0
 */
public abstract class PageController implements Serializable {

	private static final long serialVersionUID = 1556543226020361596L;

	private boolean editado;
	private boolean nuevo;

	// Impresion
	private String tituloDocumento;

	private boolean exportarPaginaActual = false;

	// Estados
	private SelectItem listaTipoNegocioItem[];
	private SelectItem listaEstadoItem[];

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public String crear() {
		limpiar();
		setEditado(true);
		return "";
	}

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public abstract String editar();

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public abstract String guardar();

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public abstract String eliminar();

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public String cancelar() {
		setEditado(false);
		limpiar();
		return "";
	}

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	public abstract String limpiar();

	/**
	 * 
	 * Permite agregar mensajes de error en la pagina indicando el id del componente message de la pagina
	 * 
	 * @param severityError
	 * @param id
	 * @param detail
	 */
	protected void addMessage(Severity severityError, final String id, final String detail) {
		FacesMessage errorMessage = new FacesMessage();
		errorMessage.setSummary("");
		errorMessage.setDetail(" " + detail);
		errorMessage.setSeverity(severityError);
		FacesContext.getCurrentInstance().addMessage(id, errorMessage);
	}

	/**
	 * 
	 * Permite agregar mensajes de error en la pagina indicando el id del componente message de la pagina
	 * 
	 * @param detail
	 */
	protected void addErrorMessage(final String detail) {
		addMessage(FacesMessage.SEVERITY_ERROR, null, detail);
	}

	/**
	 * 
	 * Permite agregar mensajes de informacion en la pagina indicando el id del componente message de la pagina
	 * 
	 * @param detail
	 */
	protected void addInfoMessage(final String detail) {
		addMessage(FacesMessage.SEVERITY_INFO, null, detail);
	}

	/**
	 * 
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param document
	 */
	public void postProcessXLS(Object document) {
		HSSFWorkbook wb = (HSSFWorkbook) document;
		HSSFSheet sheet = wb.getSheetAt(0);
		HSSFRow header = sheet.getRow(0);

		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setFillForegroundColor(HSSFColor.BLUE_GREY.index);
		cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

		for (int i = 0; i < header.getPhysicalNumberOfCells(); i++) {
			HSSFCell cell = header.getCell(i);
			sheet.autoSizeColumn(i);
			cell.setCellStyle(cellStyle);
		}
	}

	/**
	 * Get del atributo listaEstadoItem
	 * 
	 * @return el valor del atributo listaEstadoItem
	 */
	public SelectItem[] getListaTipoNegocioItem() {

		if (listaTipoNegocioItem == null) {
			List<SelectItem> lista = new ArrayList<SelectItem>();
			lista.add(new SelectItem("", ""));
			for (TipoNegocio t : TipoNegocio.values()) {
				SelectItem item = new SelectItem(t, t.getNombre());
				lista.add(item);
			}
			listaTipoNegocioItem = lista.toArray(new SelectItem[lista.size()]);
		}
		return listaTipoNegocioItem;
	}

	/**
	 * Get del atributo listaEstadoItem
	 * 
	 * @return el valor del atributo listaEstadoItem
	 */
	public SelectItem[] getListaEstadoItem() {

		if (listaEstadoItem == null) {
			List<SelectItem> lista = new ArrayList<SelectItem>();
			lista.add(new SelectItem("", ""));
			for (Estado t : Estado.values()) {
				SelectItem item = new SelectItem(t, t.getNombre());
				lista.add(item);
			}
			listaEstadoItem = lista.toArray(new SelectItem[lista.size()]);
		}
		return listaEstadoItem;
	}

	/**
	 * Get del atributo tituloDocumento
	 * 
	 * @return el valor del atributo tituloDocumento
	 */
	public String getTituloDocumento() {
		return tituloDocumento;
	}

	/**
	 * Set del atributo tituloDocumento
	 * 
	 * @param tituloDocumento
	 *            valor para asignar al atributo tituloDocumento
	 */
	public void setTituloDocumento(String tituloDocumento) {
		this.tituloDocumento = tituloDocumento;
	}

	/**
	 * Get del atributo exportarPaginaActual
	 * 
	 * @return el valor del atributo exportarPaginaActual
	 */
	public boolean isExportarPaginaActual() {
		return exportarPaginaActual;
	}

	/**
	 * Set del atributo exportarPaginaActual
	 * 
	 * @param exportarPaginaActual
	 *            valor para asignar al atributo exportarPaginaActual
	 */
	public void setExportarPaginaActual(boolean exportarPaginaActual) {
		this.exportarPaginaActual = exportarPaginaActual;
	}

	/**
	 * Get del atributo editado
	 * 
	 * @return el valor del atributo editado
	 */
	public boolean isEditado() {
		return editado;
	}

	/**
	 * Set del atributo editado
	 * 
	 * @param editado
	 *            valor para asignar al atributo editado
	 */
	public void setEditado(boolean editado) {
		this.editado = editado;
	}

	/**
	 * Get del atributo nuevo
	 * 
	 * @return el valor del atributo nuevo
	 */
	public boolean isNuevo() {
		return nuevo;
	}

	/**
	 * Set del atributo nuevo
	 * 
	 * @param nuevo
	 *            valor para asignar al atributo nuevo
	 */
	public void setNuevo(boolean nuevo) {
		this.nuevo = nuevo;
	}

	public int getNumeroPaginas() {
		return 20;
	}

}
